package features.advance.leetcode.geometry;

public class Solution892 {
    /**
     * 在N*N的网格上，我们放置一些1 * 1 * 1的立方体。
     *
     * 每个值v = grid[i][j]表示v个正方体叠放在对应单元格(i, j)上。
     *
     * 请你返回最终形体的表面积。
     *
     *  
     *
     * 示例 1：
     *
     * 输入：[[2]]
     * 输出：10
     * 示例 2：
     *
     * 输入：[[1,2],[3,4]]
     * 输出：34
     * 示例 3：
     *
     * 输入：[[1,0],[0,2]]
     * 输出：16
     * 示例 4：
     *
     * 输入：[[1,1,1],[1,0,1],[1,1,1]]
     * 输出：32
     * 示例5：
     *
     * 输入：[[2,2,2],[2,1,2],[2,2,2]]
     * 输出：46
     *
     *
     * 提示：
     *
     * 1 <= N <= 50
     * 0 <= grid[i][j] <= 50
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode-cn.com/problems/surface-area-of-3d-shapes
     * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     * @param grid 入参
     * @return 总面积
     */
    public int surfaceArea(int[][] grid) {
        int N = grid.length;
        int res = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                // 上边露出的表面积
                res += i-1 >= 0 ? Math.max(grid[i][j] - grid[i-1][j], 0) : grid[i][j];
                // 下边露出的表面积
                res += i+1 < N ? Math.max(grid[i][j] - grid[i+1][j], 0) : grid[i][j];
                // 左边露出的表面积
                res += j-1 >= 0 ? Math.max(grid[i][j] - grid[i][j-1], 0) : grid[i][j];
                // 右边露出的表面积
                res += j+1 < N ? Math.max(grid[i][j] - grid[i][j+1], 0) : grid[i][j];
                // 顶部、底部的表面积
                res += 2 * (grid[i][j] > 0 ? 1 : 0);
            }
        }
        return res;
    }

    public int s(int[][] grid){
        int N = grid.length;
        int res = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
//                res += i-1>=0?Math.max(grid[i][j] - grid[i-1][j],0) : grid[i][j];
                res += j-1>=0 ? Math.max(grid[i][j] - grid[i][j-1],0) : grid[i][j];

            }
        }
        return res;
    }
}